package multi_thread.master.executors;

import java.time.LocalDateTime;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author Cheng Jun
 * Description: 缓存式的线程池 适合高并发，执行时间短 many short-lived asynchronous tasks
 * 有闲置的线程用闲置的，没闲置的线程就新建。空闲时间超过60秒的线程会被清除
 * 优点：对于 耗时短，并发高的情况 表现出很高的性能
 * 缺点： 如果线程耗时过长，并发高的情况下，会导致CPU飙升
 * @version 1.0
 * @date 2021/10/9 20:34
 * @see Executors#newCachedThreadPool()
 */
public class Executor_CachedThreadPool {

    public static void main(String[] args) {

        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Runnable task = () -> {
                System.out.println(Thread.currentThread().getName() + " 时间：" + LocalDateTime.now());
            };
            cachedThreadPool.execute(task);
        }
        // 关闭 线程池，但是之前提交的任务会被执行完
        // 线程池不用的话，就要关掉，免得浪费资源。
        // 线程池如果没有显示的引用，而且线程池里没有线程，该线程池也会自动被jvm回收
        cachedThreadPool.shutdown();
        System.out.println("cachedThreadPool.isShutdown()" + cachedThreadPool.isShutdown());
    }

}
